﻿Imports System.Net
Imports System.Web
Imports System.IO
Imports System.Xml
Imports System.Text
Imports System.Runtime.CompilerServices
Imports System.Runtime.Serialization.Json
Imports System.Net.Cache
Imports Sgml

''' <summary>
''' WebスクレイピングでTwitterにアクセスします。
''' </summary>
''' <remarks>
''' 
''' </remarks>
Partial Public Class TwitterClient
    Implements IDisposable

    Private Const StrThisInstanceIsNotLoginedYet As String = "This instance is not logined yet."
    Private Const StrAsyncThreadIsBusyNow As String = "Async thread is busy now."
    Private _cookies As New CookieContainer
    Private _authenticityToken As String
    Private _authenticityTokenFiledName As String

    Private Event OnInitialize As EventHandler
    Private Event OnFinalize As EventHandler

    Private _isLogined As Boolean
    ''' <summary>
    ''' Twitterにログインしているかを取得します。
    ''' </summary>
    ''' <returns>ログインしていればTrue,ログインしていなければFalse</returns>
    ''' <remarks>
    ''' このプロパティがFalseのときにLoginまたはBeginLogin以外のメソッドを呼び出そうとするとInvalidOperationExceptionがスローされます。
    ''' </remarks>
    Public ReadOnly Property IsLogined() As Boolean
        Get
            Return _isLogined
        End Get
    End Property

    Private _userName As String
    ''' <summary>
    ''' Twitterにログインしているユーザー名を取得します。
    ''' </summary>
    ''' <returns>ユーザー名</returns>
    ''' <remarks></remarks>
    Public ReadOnly Property UserName() As String
        Get
            Return _userName
        End Get
    End Property

    ''' <summary>
    ''' TwitterClientを初期化します。
    ''' </summary>
    ''' <remarks>
    ''' TwitterClientは、単一のアカウントのみログイン状態を保持できます。
    ''' 複数アカウントにログインする場合などは、それぞれで新しいインスタンスを初期化してください。
    ''' </remarks>
    Public Sub New()
        System.Net.ServicePointManager.Expect100Continue = False

        RaiseEvent OnInitialize(Me, EventArgs.Empty)
    End Sub

    Private _isDisposed As Boolean = False
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not _isDisposed Then
            If disposing Then
                RaiseEvent OnFinalize(Me, EventArgs.Empty)
            End If
            Logout()
        End If
        _isDisposed = True
    End Sub

#Region " IDisposable Support "
    ' このコードは、破棄可能なパターンを正しく実装できるように Visual Basic によって追加されました。
    Public Sub Dispose() Implements IDisposable.Dispose
        ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(ByVal disposing As Boolean) に記述します。
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
#End Region

End Class